{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Cho6oVk5Mvfd"
      },
      "source": [
        "# Imports"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "XCcXCYDWKAyU"
      },
      "outputs": [],
      "source": [
        "!pip3 install -q tf-models-nightly\n",
        "# Fix Colab default opencv problem\n",
        "!pip3 install -q opencv-python-headless==4.1.2.30"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "3669AfhUp2Z1"
      },
      "outputs": [],
      "source": [
        "import tensorflow_datasets as tfds\n",
        "import tensorflow as tf\n",
        "\n",
        "import matplotlib.pyplot as plt\n",
        "import numpy as np\n",
        "\n",
        "tf.keras.utils.set_random_seed(0)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "G6oWRL4bO_Hc"
      },
      "outputs": [],
      "source": [
        "concat_features = tfm.uplift.layers.encoders.concat_features\n",
        "two_tower_logits_head = tfm.uplift.layers.heads.two_tower_logits_head\n",
        "two_tower_uplift_network = tfm.uplift.layers.uplift_networks.two_tower_uplift_network\n",
        "two_tower_uplift_model = tfm.uplift.models.two_tower_uplift_model\n",
        "true_logits_loss = tfm.uplift.losses.true_logits_loss\n",
        "treatment_fraction = tfm.uplift.metrics.treatment_fraction\n",
        "uplift_mean = tfm.uplift.metrics.uplift_mean\n",
        "label_mean = tfm.uplift.metrics.label_mean"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "cRD_we8jD5Bn"
      },
      "source": [
        "# Introduction\n",
        "\n",
        "Uplift modeling is a crucial research area focused on estimating the causal influence of a treatment on an individual's behavior. It predicts how a customer's actions differ with and without the treatment. Within digital advertising for example, this treatment might involve exposure to various ads. Uplift modeling can then optimize marketing efforts by targeting users who demonstrate the most significant potential return on investment. This approach is essential because customers exhibit varied responses to treatments:\n",
        "\n",
        "- *persuadables*: these individuals consistently react positively to marketing, mostly purchasing only when exposed to the treatment\n",
        "- *do not disturbs*: this group has a strongly negative reaction to marketing; they are likely to purchase if left untreated\n",
        "- *lost causes*: these customers won't purchase regardless of marketing efforts, making spending ineffective\n",
        "- *sure things*: these consumers will purchase irrespective of marketing, eliminating the need for targeted spending\n",
        "\n",
        "Therefore, uplift modeling aims to pinpoint the *persuadables*, conserve resources by avoiding *sure things* and *lost causes*, and prevent negative experiences for the *do not disturbs*.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "bmqbMyHubN02"
      },
      "source": [
        "# Dataset\n",
        "\n",
        "This colab walks through a very simple overview of how to use the uplift modeling library to build, train and evaluate an uplift model on large scale data. The dataset used in this colab is Criteo's uplift prediction [dataset](https://ailab.criteo.com/criteo-uplift-prediction-dataset/). This dataset is constructed by assembling data resulting from several incrementality tests, a particular randomized trial procedure where a random part of the population is prevented from being targeted by advertising.\n",
        "\n",
        "The data is collected such that at a pre-defined moment, users are randomly assigned to either a treated or control group. Before this assignment, user features (mainly related to prior activity) are collected. After assignment, the treated group receives personalized advertising while the control group does not. Ad visits and online conversions are logged for two weeks following assignment. Finally, the initial user features, treatment status, ad exposure, visits, and conversions are combined for analysis. Note that it is possible for a user in the treatment group to never get exposed to the treatment, which is indicated by the \"exposure\" feature. Nevertheless, we will ignore this feature in this analysis in order to keep the validity of the randomized control trial setting and to ensure that the uplift $u(x)$ is calculated by the difference of the following conditional expectations:\n",
        "\n",
        "\n",
        "$$u(x) = \\mathbb{E}[Y | T=1, X=x] - \\mathbb{E}[Y | T=0, X=x]$$\n",
        "\n",
        "\n",
        "The dataset consists of 14M rows, each one representing a user with eleven features, a treatment indicator and two possible labels (visits and conversions). The data fields are as follows:\n",
        "\n",
        "- f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11: anonymized feature values\n",
        "- treatment: treatment group (0 = control, 1 = treatment)\n",
        "- visit: whether a visit occured for this user (0 = did not visit, 1 = visited)\n",
        "- conversion: whether a conversion occured for this user (0 = did not purchase, 1 = purchased)\n",
        "- exposure: whether the user was exposed to a treatment during the experiment (0 = not exposed, 1 = exposed)\n",
        "\n",
        "A more comprehensive introduction to the Criteo dataset can be found in their accompanying papers [[1](https://hal.science/hal-02515860v1/document)] and [[2](https://arxiv.org/pdf/2111.10106.pdf)]."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "executionInfo": {
          "elapsed": 3218,
          "status": "ok",
          "timestamp": 1712877008190,
          "user": {
            "displayName": "",
            "userId": ""
          },
          "user_tz": 420
        },
        "id": "oCAzKYhu9N6X",
        "outputId": "d7d77311-dab5-4b16-9dba-9dc79b01e9db"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Number of datapoints: 13979592\n"
          ]
        }
      ],
      "source": [
        "# Load dataset (all of the data is stored under the \"train\" split).\n",
        "full_dataset = tfds.load(\"criteo\")[\"train\"]\n",
        "full_dataset = full_dataset.shuffle(\n",
        "    buffer_size=10_000,\n",
        "    seed=0,\n",
        "    reshuffle_each_iteration=False,\n",
        ")\n",
        "print(f\"Number of datapoints: {full_dataset.cardinality().numpy()}\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "executionInfo": {
          "elapsed": 2,
          "status": "ok",
          "timestamp": 1712877008294,
          "user": {
            "displayName": "",
            "userId": ""
          },
          "user_tz": 420
        },
        "id": "J-lzb-b39oOm",
        "outputId": "3f4cc1ef-5e50-48f8-8b4e-8596c6912e14"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Number of train datapoints: 12979592\n",
            "Number of test datapoints:  1000000\n"
          ]
        }
      ],
      "source": [
        "# Use 1M examples for testing and keep the rest for training.\n",
        "N_TEST = 1_000_000\n",
        "\n",
        "test_dataset = full_dataset.take(N_TEST)\n",
        "train_dataset = full_dataset.skip(N_TEST)\n",
        "\n",
        "print(f\"Number of train datapoints: {train_dataset.cardinality().numpy()}\")\n",
        "print(f\"Number of test datapoints:  {test_dataset.cardinality().numpy()}\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "height": 363
        },
        "executionInfo": {
          "elapsed": 25120,
          "status": "ok",
          "timestamp": 1712877033536,
          "user": {
            "displayName": "",
            "userId": ""
          },
          "user_tz": 420
        },
        "id": "erj7SbIwsOFh",
        "outputId": "d6470785-9161-4c96-db64-e89319ff6088"
      },
      "outputs": [
        {
          "data": {
            "text/html": [
              "\n",
              "  \u003cdiv id=\"df-cf51283c-b4cf-4a6e-9a57-e8d8043cb5c6\" class=\"colab-df-container\"\u003e\n",
              "    \u003cdiv\u003e\n",
              "\u003cstyle scoped\u003e\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "\u003c/style\u003e\n",
              "\u003ctable border=\"1\" class=\"dataframe\"\u003e\n",
              "  \u003cthead\u003e\n",
              "    \u003ctr style=\"text-align: right;\"\u003e\n",
              "      \u003cth\u003e\u003c/th\u003e\n",
              "      \u003cth\u003econversion\u003c/th\u003e\n",
              "      \u003cth\u003eexposure\u003c/th\u003e\n",
              "      \u003cth\u003ef0\u003c/th\u003e\n",
              "      \u003cth\u003ef1\u003c/th\u003e\n",
              "      \u003cth\u003ef10\u003c/th\u003e\n",
              "      \u003cth\u003ef11\u003c/th\u003e\n",
              "      \u003cth\u003ef2\u003c/th\u003e\n",
              "      \u003cth\u003ef3\u003c/th\u003e\n",
              "      \u003cth\u003ef4\u003c/th\u003e\n",
              "      \u003cth\u003ef5\u003c/th\u003e\n",
              "      \u003cth\u003ef6\u003c/th\u003e\n",
              "      \u003cth\u003ef7\u003c/th\u003e\n",
              "      \u003cth\u003ef8\u003c/th\u003e\n",
              "      \u003cth\u003ef9\u003c/th\u003e\n",
              "      \u003cth\u003etreatment\u003c/th\u003e\n",
              "      \u003cth\u003evisit\u003c/th\u003e\n",
              "    \u003c/tr\u003e\n",
              "  \u003c/thead\u003e\n",
              "  \u003ctbody\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e0\u003c/th\u003e\n",
              "      \u003ctd\u003eFalse\u003c/td\u003e\n",
              "      \u003ctd\u003eFalse\u003c/td\u003e\n",
              "      \u003ctd\u003e26.003653\u003c/td\u003e\n",
              "      \u003ctd\u003e10.059654\u003c/td\u003e\n",
              "      \u003ctd\u003e5.300375\u003c/td\u003e\n",
              "      \u003ctd\u003e-0.168679\u003c/td\u003e\n",
              "      \u003ctd\u003e8.214383\u003c/td\u003e\n",
              "      \u003ctd\u003e4.679882\u003c/td\u003e\n",
              "      \u003ctd\u003e10.280525\u003c/td\u003e\n",
              "      \u003ctd\u003e4.115453\u003c/td\u003e\n",
              "      \u003ctd\u003e-5.987667\u003c/td\u003e\n",
              "      \u003ctd\u003e4.833815\u003c/td\u003e\n",
              "      \u003ctd\u003e3.971858\u003c/td\u003e\n",
              "      \u003ctd\u003e13.190056\u003c/td\u003e\n",
              "      \u003ctd\u003e1\u003c/td\u003e\n",
              "      \u003ctd\u003eFalse\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e1\u003c/th\u003e\n",
              "      \u003ctd\u003eFalse\u003c/td\u003e\n",
              "      \u003ctd\u003eFalse\u003c/td\u003e\n",
              "      \u003ctd\u003e19.585320\u003c/td\u003e\n",
              "      \u003ctd\u003e10.679513\u003c/td\u003e\n",
              "      \u003ctd\u003e5.300375\u003c/td\u003e\n",
              "      \u003ctd\u003e-0.168679\u003c/td\u003e\n",
              "      \u003ctd\u003e8.217696\u003c/td\u003e\n",
              "      \u003ctd\u003e1.114982\u003c/td\u003e\n",
              "      \u003ctd\u003e10.280525\u003c/td\u003e\n",
              "      \u003ctd\u003e3.013064\u003c/td\u003e\n",
              "      \u003ctd\u003e-10.527786\u003c/td\u003e\n",
              "      \u003ctd\u003e8.367581\u003c/td\u003e\n",
              "      \u003ctd\u003e3.809904\u003c/td\u003e\n",
              "      \u003ctd\u003e42.775658\u003c/td\u003e\n",
              "      \u003ctd\u003e1\u003c/td\u003e\n",
              "      \u003ctd\u003eTrue\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e2\u003c/th\u003e\n",
              "      \u003ctd\u003eFalse\u003c/td\u003e\n",
              "      \u003ctd\u003eFalse\u003c/td\u003e\n",
              "      \u003ctd\u003e12.616364\u003c/td\u003e\n",
              "      \u003ctd\u003e10.059654\u003c/td\u003e\n",
              "      \u003ctd\u003e5.300375\u003c/td\u003e\n",
              "      \u003ctd\u003e-0.168679\u003c/td\u003e\n",
              "      \u003ctd\u003e8.261647\u003c/td\u003e\n",
              "      \u003ctd\u003e4.679882\u003c/td\u003e\n",
              "      \u003ctd\u003e10.280525\u003c/td\u003e\n",
              "      \u003ctd\u003e4.115453\u003c/td\u003e\n",
              "      \u003ctd\u003e0.294443\u003c/td\u003e\n",
              "      \u003ctd\u003e4.833815\u003c/td\u003e\n",
              "      \u003ctd\u003e3.906514\u003c/td\u003e\n",
              "      \u003ctd\u003e25.240993\u003c/td\u003e\n",
              "      \u003ctd\u003e1\u003c/td\u003e\n",
              "      \u003ctd\u003eFalse\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e3\u003c/th\u003e\n",
              "      \u003ctd\u003eFalse\u003c/td\u003e\n",
              "      \u003ctd\u003eFalse\u003c/td\u003e\n",
              "      \u003ctd\u003e24.760006\u003c/td\u003e\n",
              "      \u003ctd\u003e10.059654\u003c/td\u003e\n",
              "      \u003ctd\u003e5.300375\u003c/td\u003e\n",
              "      \u003ctd\u003e-0.168679\u003c/td\u003e\n",
              "      \u003ctd\u003e8.214383\u003c/td\u003e\n",
              "      \u003ctd\u003e4.679882\u003c/td\u003e\n",
              "      \u003ctd\u003e10.280525\u003c/td\u003e\n",
              "      \u003ctd\u003e4.115453\u003c/td\u003e\n",
              "      \u003ctd\u003e-4.595459\u003c/td\u003e\n",
              "      \u003ctd\u003e4.833815\u003c/td\u003e\n",
              "      \u003ctd\u003e3.971858\u003c/td\u003e\n",
              "      \u003ctd\u003e13.190056\u003c/td\u003e\n",
              "      \u003ctd\u003e1\u003c/td\u003e\n",
              "      \u003ctd\u003eFalse\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e4\u003c/th\u003e\n",
              "      \u003ctd\u003eFalse\u003c/td\u003e\n",
              "      \u003ctd\u003eFalse\u003c/td\u003e\n",
              "      \u003ctd\u003e23.326521\u003c/td\u003e\n",
              "      \u003ctd\u003e10.059654\u003c/td\u003e\n",
              "      \u003ctd\u003e5.300375\u003c/td\u003e\n",
              "      \u003ctd\u003e-0.168679\u003c/td\u003e\n",
              "      \u003ctd\u003e8.214383\u003c/td\u003e\n",
              "      \u003ctd\u003e4.679882\u003c/td\u003e\n",
              "      \u003ctd\u003e10.280525\u003c/td\u003e\n",
              "      \u003ctd\u003e4.115453\u003c/td\u003e\n",
              "      \u003ctd\u003e-7.301017\u003c/td\u003e\n",
              "      \u003ctd\u003e4.833815\u003c/td\u003e\n",
              "      \u003ctd\u003e3.971858\u003c/td\u003e\n",
              "      \u003ctd\u003e13.190056\u003c/td\u003e\n",
              "      \u003ctd\u003e1\u003c/td\u003e\n",
              "      \u003ctd\u003eFalse\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e5\u003c/th\u003e\n",
              "      \u003ctd\u003eFalse\u003c/td\u003e\n",
              "      \u003ctd\u003eFalse\u003c/td\u003e\n",
              "      \u003ctd\u003e16.174679\u003c/td\u003e\n",
              "      \u003ctd\u003e10.059654\u003c/td\u003e\n",
              "      \u003ctd\u003e5.300375\u003c/td\u003e\n",
              "      \u003ctd\u003e-0.168679\u003c/td\u003e\n",
              "      \u003ctd\u003e8.425407\u003c/td\u003e\n",
              "      \u003ctd\u003e2.934780\u003c/td\u003e\n",
              "      \u003ctd\u003e10.280525\u003c/td\u003e\n",
              "      \u003ctd\u003e4.115453\u003c/td\u003e\n",
              "      \u003ctd\u003e-3.282109\u003c/td\u003e\n",
              "      \u003ctd\u003e4.833815\u003c/td\u003e\n",
              "      \u003ctd\u003e3.869313\u003c/td\u003e\n",
              "      \u003ctd\u003e29.214161\u003c/td\u003e\n",
              "      \u003ctd\u003e1\u003c/td\u003e\n",
              "      \u003ctd\u003eTrue\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e6\u003c/th\u003e\n",
              "      \u003ctd\u003eFalse\u003c/td\u003e\n",
              "      \u003ctd\u003eFalse\u003c/td\u003e\n",
              "      \u003ctd\u003e20.825842\u003c/td\u003e\n",
              "      \u003ctd\u003e10.059654\u003c/td\u003e\n",
              "      \u003ctd\u003e5.300375\u003c/td\u003e\n",
              "      \u003ctd\u003e-0.168679\u003c/td\u003e\n",
              "      \u003ctd\u003e8.214383\u003c/td\u003e\n",
              "      \u003ctd\u003e4.679882\u003c/td\u003e\n",
              "      \u003ctd\u003e10.280525\u003c/td\u003e\n",
              "      \u003ctd\u003e3.013064\u003c/td\u003e\n",
              "      \u003ctd\u003e-1.288207\u003c/td\u003e\n",
              "      \u003ctd\u003e8.996727\u003c/td\u003e\n",
              "      \u003ctd\u003e3.971858\u003c/td\u003e\n",
              "      \u003ctd\u003e13.190056\u003c/td\u003e\n",
              "      \u003ctd\u003e1\u003c/td\u003e\n",
              "      \u003ctd\u003eFalse\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e7\u003c/th\u003e\n",
              "      \u003ctd\u003eFalse\u003c/td\u003e\n",
              "      \u003ctd\u003eFalse\u003c/td\u003e\n",
              "      \u003ctd\u003e21.404404\u003c/td\u003e\n",
              "      \u003ctd\u003e10.059654\u003c/td\u003e\n",
              "      \u003ctd\u003e6.425741\u003c/td\u003e\n",
              "      \u003ctd\u003e-0.168679\u003c/td\u003e\n",
              "      \u003ctd\u003e8.800342\u003c/td\u003e\n",
              "      \u003ctd\u003e4.679882\u003c/td\u003e\n",
              "      \u003ctd\u003e11.029585\u003c/td\u003e\n",
              "      \u003ctd\u003e4.115453\u003c/td\u003e\n",
              "      \u003ctd\u003e-7.301017\u003c/td\u003e\n",
              "      \u003ctd\u003e4.833815\u003c/td\u003e\n",
              "      \u003ctd\u003e3.899112\u003c/td\u003e\n",
              "      \u003ctd\u003e13.190056\u003c/td\u003e\n",
              "      \u003ctd\u003e1\u003c/td\u003e\n",
              "      \u003ctd\u003eFalse\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e8\u003c/th\u003e\n",
              "      \u003ctd\u003eFalse\u003c/td\u003e\n",
              "      \u003ctd\u003eFalse\u003c/td\u003e\n",
              "      \u003ctd\u003e24.595268\u003c/td\u003e\n",
              "      \u003ctd\u003e10.059654\u003c/td\u003e\n",
              "      \u003ctd\u003e5.300375\u003c/td\u003e\n",
              "      \u003ctd\u003e-0.168679\u003c/td\u003e\n",
              "      \u003ctd\u003e8.214383\u003c/td\u003e\n",
              "      \u003ctd\u003e4.679882\u003c/td\u003e\n",
              "      \u003ctd\u003e10.280525\u003c/td\u003e\n",
              "      \u003ctd\u003e4.115453\u003c/td\u003e\n",
              "      \u003ctd\u003e-2.411115\u003c/td\u003e\n",
              "      \u003ctd\u003e4.833815\u003c/td\u003e\n",
              "      \u003ctd\u003e3.971858\u003c/td\u003e\n",
              "      \u003ctd\u003e13.190056\u003c/td\u003e\n",
              "      \u003ctd\u003e1\u003c/td\u003e\n",
              "      \u003ctd\u003eFalse\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e9\u003c/th\u003e\n",
              "      \u003ctd\u003eFalse\u003c/td\u003e\n",
              "      \u003ctd\u003eFalse\u003c/td\u003e\n",
              "      \u003ctd\u003e22.833614\u003c/td\u003e\n",
              "      \u003ctd\u003e10.059654\u003c/td\u003e\n",
              "      \u003ctd\u003e5.300375\u003c/td\u003e\n",
              "      \u003ctd\u003e-0.168679\u003c/td\u003e\n",
              "      \u003ctd\u003e8.214383\u003c/td\u003e\n",
              "      \u003ctd\u003e4.679882\u003c/td\u003e\n",
              "      \u003ctd\u003e10.280525\u003c/td\u003e\n",
              "      \u003ctd\u003e4.115453\u003c/td\u003e\n",
              "      \u003ctd\u003e-2.411115\u003c/td\u003e\n",
              "      \u003ctd\u003e4.833815\u003c/td\u003e\n",
              "      \u003ctd\u003e3.971858\u003c/td\u003e\n",
              "      \u003ctd\u003e13.190056\u003c/td\u003e\n",
              "      \u003ctd\u003e1\u003c/td\u003e\n",
              "      \u003ctd\u003eFalse\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "  \u003c/tbody\u003e\n",
              "\u003c/table\u003e\n",
              "\u003c/div\u003e\n",
              "    \u003cdiv class=\"colab-df-buttons\"\u003e\n",
              "\n",
              "  \u003cdiv class=\"colab-df-container\"\u003e\n",
              "    \u003cbutton class=\"colab-df-convert\" onclick=\"convertToInteractive('df-cf51283c-b4cf-4a6e-9a57-e8d8043cb5c6')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\"\u003e\n",
              "\n",
              "  \u003csvg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\"\u003e\n",
              "    \u003cpath d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/\u003e\n",
              "  \u003c/svg\u003e\n",
              "    \u003c/button\u003e\n",
              "\n",
              "  \u003cstyle\u003e\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  \u003c/style\u003e\n",
              "\n",
              "    \u003cscript\u003e\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-cf51283c-b4cf-4a6e-9a57-e8d8043cb5c6 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-cf51283c-b4cf-4a6e-9a57-e8d8043cb5c6');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '\u003ca target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb\u003edata table notebook\u003c/a\u003e'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    \u003c/script\u003e\n",
              "  \u003c/div\u003e\n",
              "\n",
              "\n",
              "\u003cdiv id=\"df-05e44069-9608-4cf5-a0c5-2da213d958b4\"\u003e\n",
              "  \u003cbutton class=\"colab-df-quickchart\" onclick=\"quickchart('df-05e44069-9608-4cf5-a0c5-2da213d958b4')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\"\u003e\n",
              "\n",
              "\u003csvg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\"\u003e\n",
              "    \u003cg\u003e\n",
              "        \u003cpath d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/\u003e\n",
              "    \u003c/g\u003e\n",
              "\u003c/svg\u003e\n",
              "  \u003c/button\u003e\n",
              "\n",
              "\u003cstyle\u003e\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "\u003c/style\u003e\n",
              "\n",
              "  \u003cscript\u003e\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() =\u003e {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-05e44069-9608-4cf5-a0c5-2da213d958b4 button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  \u003c/script\u003e\n",
              "\u003c/div\u003e\n",
              "    \u003c/div\u003e\n",
              "  \u003c/div\u003e\n"
            ],
            "text/plain": [
              "   conversion  exposure         f0  ...         f9  treatment  visit\n",
              "0       False     False  26.003653  ...  13.190056          1  False\n",
              "1       False     False  19.585320  ...  42.775658          1   True\n",
              "2       False     False  12.616364  ...  25.240993          1  False\n",
              "3       False     False  24.760006  ...  13.190056          1  False\n",
              "4       False     False  23.326521  ...  13.190056          1  False\n",
              "5       False     False  16.174679  ...  29.214161          1   True\n",
              "6       False     False  20.825842  ...  13.190056          1  False\n",
              "7       False     False  21.404404  ...  13.190056          1  False\n",
              "8       False     False  24.595268  ...  13.190056          1  False\n",
              "9       False     False  22.833614  ...  13.190056          1  False\n",
              "\n",
              "[10 rows x 16 columns]"
            ]
          },
          "execution_count": 5,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Take a small sample for exploratory data analysis.\n",
        "sample_df = tfds.as_dataframe(train_dataset.take(10_000))\n",
        "sample_df.head(10)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "height": 300
        },
        "executionInfo": {
          "elapsed": 54,
          "status": "ok",
          "timestamp": 1712877033715,
          "user": {
            "displayName": "",
            "userId": ""
          },
          "user_tz": 420
        },
        "id": "EhuI-cgq5cpI",
        "outputId": "ecc6620a-8c3c-43c7-e4ad-bacbf3e15597"
      },
      "outputs": [
        {
          "data": {
            "text/html": [
              "\n",
              "  \u003cdiv id=\"df-2c8694ae-813f-48ee-9f9f-8c7746030f28\" class=\"colab-df-container\"\u003e\n",
              "    \u003cdiv\u003e\n",
              "\u003cstyle scoped\u003e\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "\u003c/style\u003e\n",
              "\u003ctable border=\"1\" class=\"dataframe\"\u003e\n",
              "  \u003cthead\u003e\n",
              "    \u003ctr style=\"text-align: right;\"\u003e\n",
              "      \u003cth\u003e\u003c/th\u003e\n",
              "      \u003cth\u003econversion\u003c/th\u003e\n",
              "      \u003cth\u003ef0\u003c/th\u003e\n",
              "      \u003cth\u003ef1\u003c/th\u003e\n",
              "      \u003cth\u003ef10\u003c/th\u003e\n",
              "      \u003cth\u003ef11\u003c/th\u003e\n",
              "      \u003cth\u003ef2\u003c/th\u003e\n",
              "      \u003cth\u003ef3\u003c/th\u003e\n",
              "      \u003cth\u003ef4\u003c/th\u003e\n",
              "      \u003cth\u003ef5\u003c/th\u003e\n",
              "      \u003cth\u003ef6\u003c/th\u003e\n",
              "      \u003cth\u003ef7\u003c/th\u003e\n",
              "      \u003cth\u003ef8\u003c/th\u003e\n",
              "      \u003cth\u003ef9\u003c/th\u003e\n",
              "      \u003cth\u003etreatment\u003c/th\u003e\n",
              "      \u003cth\u003evisit\u003c/th\u003e\n",
              "    \u003c/tr\u003e\n",
              "  \u003c/thead\u003e\n",
              "  \u003ctbody\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003ecount\u003c/th\u003e\n",
              "      \u003ctd\u003e10000.00000\u003c/td\u003e\n",
              "      \u003ctd\u003e10000.000000\u003c/td\u003e\n",
              "      \u003ctd\u003e10000.000000\u003c/td\u003e\n",
              "      \u003ctd\u003e10000.000000\u003c/td\u003e\n",
              "      \u003ctd\u003e10000.000000\u003c/td\u003e\n",
              "      \u003ctd\u003e10000.000000\u003c/td\u003e\n",
              "      \u003ctd\u003e10000.000000\u003c/td\u003e\n",
              "      \u003ctd\u003e10000.000000\u003c/td\u003e\n",
              "      \u003ctd\u003e10000.000000\u003c/td\u003e\n",
              "      \u003ctd\u003e10000.000000\u003c/td\u003e\n",
              "      \u003ctd\u003e10000.000000\u003c/td\u003e\n",
              "      \u003ctd\u003e10000.000000\u003c/td\u003e\n",
              "      \u003ctd\u003e10000.000000\u003c/td\u003e\n",
              "      \u003ctd\u003e10000.000000\u003c/td\u003e\n",
              "      \u003ctd\u003e10000.000000\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003emean\u003c/th\u003e\n",
              "      \u003ctd\u003e0.00250\u003c/td\u003e\n",
              "      \u003ctd\u003e19.599846\u003c/td\u003e\n",
              "      \u003ctd\u003e10.069551\u003c/td\u003e\n",
              "      \u003ctd\u003e5.332988\u003c/td\u003e\n",
              "      \u003ctd\u003e-0.171190\u003c/td\u003e\n",
              "      \u003ctd\u003e8.448245\u003c/td\u003e\n",
              "      \u003ctd\u003e4.177443\u003c/td\u003e\n",
              "      \u003ctd\u003e10.338730\u003c/td\u003e\n",
              "      \u003ctd\u003e4.031238\u003c/td\u003e\n",
              "      \u003ctd\u003e-4.131609\u003c/td\u003e\n",
              "      \u003ctd\u003e5.097363\u003c/td\u003e\n",
              "      \u003ctd\u003e3.932956\u003c/td\u003e\n",
              "      \u003ctd\u003e16.088783\u003c/td\u003e\n",
              "      \u003ctd\u003e0.849700\u003c/td\u003e\n",
              "      \u003ctd\u003e0.046800\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003estd\u003c/th\u003e\n",
              "      \u003ctd\u003e0.04994\u003c/td\u003e\n",
              "      \u003ctd\u003e5.362421\u003c/td\u003e\n",
              "      \u003ctd\u003e0.094223\u003c/td\u003e\n",
              "      \u003ctd\u003e0.167144\u003c/td\u003e\n",
              "      \u003ctd\u003e0.024777\u003c/td\u003e\n",
              "      \u003ctd\u003e0.299626\u003c/td\u003e\n",
              "      \u003ctd\u003e1.336848\u003c/td\u003e\n",
              "      \u003ctd\u003e0.340552\u003c/td\u003e\n",
              "      \u003ctd\u003e0.412840\u003c/td\u003e\n",
              "      \u003ctd\u003e4.535934\u003c/td\u003e\n",
              "      \u003ctd\u003e1.191975\u003c/td\u003e\n",
              "      \u003ctd\u003e0.057004\u003c/td\u003e\n",
              "      \u003ctd\u003e7.101997\u003c/td\u003e\n",
              "      \u003ctd\u003e0.357383\u003c/td\u003e\n",
              "      \u003ctd\u003e0.211221\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003emin\u003c/th\u003e\n",
              "      \u003ctd\u003e0.00000\u003c/td\u003e\n",
              "      \u003ctd\u003e12.616364\u003c/td\u003e\n",
              "      \u003ctd\u003e10.059654\u003c/td\u003e\n",
              "      \u003ctd\u003e5.300375\u003c/td\u003e\n",
              "      \u003ctd\u003e-0.827690\u003c/td\u003e\n",
              "      \u003ctd\u003e8.214383\u003c/td\u003e\n",
              "      \u003ctd\u003e-5.106985\u003c/td\u003e\n",
              "      \u003ctd\u003e10.280525\u003c/td\u003e\n",
              "      \u003ctd\u003e-2.404006\u003c/td\u003e\n",
              "      \u003ctd\u003e-23.423904\u003c/td\u003e\n",
              "      \u003ctd\u003e4.833815\u003c/td\u003e\n",
              "      \u003ctd\u003e3.682439\u003c/td\u003e\n",
              "      \u003ctd\u003e13.190056\u003c/td\u003e\n",
              "      \u003ctd\u003e0.000000\u003c/td\u003e\n",
              "      \u003ctd\u003e0.000000\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e25%\u003c/th\u003e\n",
              "      \u003ctd\u003e0.00000\u003c/td\u003e\n",
              "      \u003ctd\u003e12.616364\u003c/td\u003e\n",
              "      \u003ctd\u003e10.059654\u003c/td\u003e\n",
              "      \u003ctd\u003e5.300375\u003c/td\u003e\n",
              "      \u003ctd\u003e-0.168679\u003c/td\u003e\n",
              "      \u003ctd\u003e8.214383\u003c/td\u003e\n",
              "      \u003ctd\u003e4.679882\u003c/td\u003e\n",
              "      \u003ctd\u003e10.280525\u003c/td\u003e\n",
              "      \u003ctd\u003e4.115453\u003c/td\u003e\n",
              "      \u003ctd\u003e-6.699321\u003c/td\u003e\n",
              "      \u003ctd\u003e4.833815\u003c/td\u003e\n",
              "      \u003ctd\u003e3.910792\u003c/td\u003e\n",
              "      \u003ctd\u003e13.190056\u003c/td\u003e\n",
              "      \u003ctd\u003e1.000000\u003c/td\u003e\n",
              "      \u003ctd\u003e0.000000\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e50%\u003c/th\u003e\n",
              "      \u003ctd\u003e0.00000\u003c/td\u003e\n",
              "      \u003ctd\u003e21.919387\u003c/td\u003e\n",
              "      \u003ctd\u003e10.059654\u003c/td\u003e\n",
              "      \u003ctd\u003e5.300375\u003c/td\u003e\n",
              "      \u003ctd\u003e-0.168679\u003c/td\u003e\n",
              "      \u003ctd\u003e8.214383\u003c/td\u003e\n",
              "      \u003ctd\u003e4.679882\u003c/td\u003e\n",
              "      \u003ctd\u003e10.280525\u003c/td\u003e\n",
              "      \u003ctd\u003e4.115453\u003c/td\u003e\n",
              "      \u003ctd\u003e-2.411115\u003c/td\u003e\n",
              "      \u003ctd\u003e4.833815\u003c/td\u003e\n",
              "      \u003ctd\u003e3.971858\u003c/td\u003e\n",
              "      \u003ctd\u003e13.190056\u003c/td\u003e\n",
              "      \u003ctd\u003e1.000000\u003c/td\u003e\n",
              "      \u003ctd\u003e0.000000\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e75%\u003c/th\u003e\n",
              "      \u003ctd\u003e0.00000\u003c/td\u003e\n",
              "      \u003ctd\u003e24.411213\u003c/td\u003e\n",
              "      \u003ctd\u003e10.059654\u003c/td\u003e\n",
              "      \u003ctd\u003e5.300375\u003c/td\u003e\n",
              "      \u003ctd\u003e-0.168679\u003c/td\u003e\n",
              "      \u003ctd\u003e8.732892\u003c/td\u003e\n",
              "      \u003ctd\u003e4.679882\u003c/td\u003e\n",
              "      \u003ctd\u003e10.280525\u003c/td\u003e\n",
              "      \u003ctd\u003e4.115453\u003c/td\u003e\n",
              "      \u003ctd\u003e0.294443\u003c/td\u003e\n",
              "      \u003ctd\u003e4.833815\u003c/td\u003e\n",
              "      \u003ctd\u003e3.971858\u003c/td\u003e\n",
              "      \u003ctd\u003e13.190056\u003c/td\u003e\n",
              "      \u003ctd\u003e1.000000\u003c/td\u003e\n",
              "      \u003ctd\u003e0.000000\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003emax\u003c/th\u003e\n",
              "      \u003ctd\u003e1.00000\u003c/td\u003e\n",
              "      \u003ctd\u003e26.745085\u003c/td\u003e\n",
              "      \u003ctd\u003e12.520096\u003c/td\u003e\n",
              "      \u003ctd\u003e6.473310\u003c/td\u003e\n",
              "      \u003ctd\u003e-0.168679\u003c/td\u003e\n",
              "      \u003ctd\u003e9.051891\u003c/td\u003e\n",
              "      \u003ctd\u003e4.679882\u003c/td\u003e\n",
              "      \u003ctd\u003e16.369278\u003c/td\u003e\n",
              "      \u003ctd\u003e4.115453\u003c/td\u003e\n",
              "      \u003ctd\u003e0.294443\u003c/td\u003e\n",
              "      \u003ctd\u003e11.991045\u003c/td\u003e\n",
              "      \u003ctd\u003e3.971858\u003c/td\u003e\n",
              "      \u003ctd\u003e57.158524\u003c/td\u003e\n",
              "      \u003ctd\u003e1.000000\u003c/td\u003e\n",
              "      \u003ctd\u003e1.000000\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "  \u003c/tbody\u003e\n",
              "\u003c/table\u003e\n",
              "\u003c/div\u003e\n",
              "    \u003cdiv class=\"colab-df-buttons\"\u003e\n",
              "\n",
              "  \u003cdiv class=\"colab-df-container\"\u003e\n",
              "    \u003cbutton class=\"colab-df-convert\" onclick=\"convertToInteractive('df-2c8694ae-813f-48ee-9f9f-8c7746030f28')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\"\u003e\n",
              "\n",
              "  \u003csvg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\"\u003e\n",
              "    \u003cpath d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/\u003e\n",
              "  \u003c/svg\u003e\n",
              "    \u003c/button\u003e\n",
              "\n",
              "  \u003cstyle\u003e\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  \u003c/style\u003e\n",
              "\n",
              "    \u003cscript\u003e\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-2c8694ae-813f-48ee-9f9f-8c7746030f28 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-2c8694ae-813f-48ee-9f9f-8c7746030f28');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '\u003ca target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb\u003edata table notebook\u003c/a\u003e'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    \u003c/script\u003e\n",
              "  \u003c/div\u003e\n",
              "\n",
              "\n",
              "\u003cdiv id=\"df-656d0ac2-96c9-427f-a622-f7e5d831f9ce\"\u003e\n",
              "  \u003cbutton class=\"colab-df-quickchart\" onclick=\"quickchart('df-656d0ac2-96c9-427f-a622-f7e5d831f9ce')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\"\u003e\n",
              "\n",
              "\u003csvg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\"\u003e\n",
              "    \u003cg\u003e\n",
              "        \u003cpath d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/\u003e\n",
              "    \u003c/g\u003e\n",
              "\u003c/svg\u003e\n",
              "  \u003c/button\u003e\n",
              "\n",
              "\u003cstyle\u003e\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "\u003c/style\u003e\n",
              "\n",
              "  \u003cscript\u003e\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() =\u003e {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-656d0ac2-96c9-427f-a622-f7e5d831f9ce button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  \u003c/script\u003e\n",
              "\u003c/div\u003e\n",
              "    \u003c/div\u003e\n",
              "  \u003c/div\u003e\n"
            ],
            "text/plain": [
              "        conversion            f0  ...     treatment         visit\n",
              "count  10000.00000  10000.000000  ...  10000.000000  10000.000000\n",
              "mean       0.00250     19.599846  ...      0.849700      0.046800\n",
              "std        0.04994      5.362421  ...      0.357383      0.211221\n",
              "min        0.00000     12.616364  ...      0.000000      0.000000\n",
              "25%        0.00000     12.616364  ...      1.000000      0.000000\n",
              "50%        0.00000     21.919387  ...      1.000000      0.000000\n",
              "75%        0.00000     24.411213  ...      1.000000      0.000000\n",
              "max        1.00000     26.745085  ...      1.000000      1.000000\n",
              "\n",
              "[8 rows x 15 columns]"
            ]
          },
          "execution_count": 6,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "sample_df[[\"visit\", \"conversion\"]] = sample_df[[\"visit\", \"conversion\"]].astype(int)\n",
        "sample_df.describe()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "executionInfo": {
          "elapsed": 1,
          "status": "ok",
          "timestamp": 1712877033835,
          "user": {
            "displayName": "",
            "userId": ""
          },
          "user_tz": 420
        },
        "id": "p0Asbitw6cJe",
        "outputId": "1ba45783-fb60-4383-822c-6efabe609172"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Treatment fraction: 0.8497\n"
          ]
        }
      ],
      "source": [
        "print(f\"Treatment fraction: {sample_df.treatment.mean()}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "U4VNVQPMAi9O"
      },
      "source": [
        "The data is highly imbalanced since 85% of the examples belong to the treatment group. This does not necessarily pose a problem for uplift modeling though, as we will discuss in greater detail in the next section."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "executionInfo": {
          "elapsed": 52,
          "status": "ok",
          "timestamp": 1712877034019,
          "user": {
            "displayName": "",
            "userId": ""
          },
          "user_tz": 420
        },
        "id": "hV16GZeg758K",
        "outputId": "035d0805-b866-4172-a870-eafd15a936e1"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Average visit rate: 0.0468\n",
            "Average conversion rate: 0.0025\n"
          ]
        }
      ],
      "source": [
        "print(f\"Average visit rate: {sample_df.visit.mean()}\")\n",
        "print(f\"Average conversion rate: {sample_df.conversion.mean()}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "SuJgzrRV8GXo"
      },
      "source": [
        "The conversion rate is significantly lower than the visit rate, providing a sparser and therefore more challenging dataset for model training. Since a conversion follows from a visit, in this analysis we will focus on predicting the likelihood of visit occuring and leave the conversion estimation to a later stage."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "executionInfo": {
          "elapsed": 55,
          "status": "ok",
          "timestamp": 1712877034172,
          "user": {
            "displayName": "",
            "userId": ""
          },
          "user_tz": 420
        },
        "id": "YXckAmwo65Sj",
        "outputId": "ab11cad0-3ba9-4c32-872b-1973147b2429"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Visit rate (overall):     4.68%\n",
            "Visit rate (control):     3.53%\n",
            "Visit rate (treatment):   4.88%\n",
            "Average treatment effect: 1.36%\n"
          ]
        }
      ],
      "source": [
        "ctrl_visit_rate = sample_df[sample_df.treatment == 0].visit.mean() * 100\n",
        "trmt_visit_rate = sample_df[sample_df.treatment == 1].visit.mean() * 100\n",
        "visit_rate = sample_df.visit.mean() * 100\n",
        "\n",
        "print(f\"Visit rate (overall):     {visit_rate:.2f}%\")\n",
        "print(f\"Visit rate (control):     {ctrl_visit_rate:.2f}%\")\n",
        "print(f\"Visit rate (treatment):   {trmt_visit_rate:.2f}%\")\n",
        "print(f\"Average treatment effect: {trmt_visit_rate - ctrl_visit_rate:.2f}%\")"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "m215SfwI_ICf"
      },
      "source": [
        "As expected, the treatment group has a higher visit rate (4.88%) than the control group (3.53%). The average treatment effect (1.36%) suggests that the treatment is effective at increasing the visit rate, and is a good starting point for uplift modeling. An uplift model is typically used to identify the set of users whose likelihood of visiting increases the most when exposed to the treatment."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "YuM6Zo0CJL8F"
      },
      "source": [
        "# Randomized Control Trial Test\n",
        "\n",
        "Randomized controlled trials are considered the gold standard for estimating causal effects because they help mitigate two major threats to drawing causal conclusions from data: confounding and selection bias. The randomization balances out the distribution of confounding variables across the control and treatment groups, which helps isolate the true treatment effect.\n",
        "\n",
        "Since uplift models aim to predict the difference in outcome between receiving a treatment and not receiving it, if the data is biased the model might learn patterns that do not reflect the true impact of the treatment. We can test if the data is truly random by training a classifier to predict whether an example belongs to the treatment group from its feature set. In a randomized control trial setting it should not be possible for a model to predict if an example belongs to the treatment group or not."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "executionInfo": {
          "elapsed": 499191,
          "status": "ok",
          "timestamp": 1712877533455,
          "user": {
            "displayName": "",
            "userId": ""
          },
          "user_tz": 420
        },
        "id": "Y4wR_bTtJOFJ",
        "outputId": "3e125912-b4ea-42ae-8fb1-662d4fd12d53"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Epoch 1/3\n",
            "12676/12676 [==============================] - 203s 15ms/step - loss: 0.4236 - binary_accuracy: 0.8499 - auc: 0.5059 - val_loss: 0.4224 - val_binary_accuracy: 0.8502 - val_auc: 0.5096\n",
            "Epoch 2/3\n",
            "12676/12676 [==============================] - 155s 11ms/step - loss: 0.4228 - binary_accuracy: 0.8500 - auc: 0.5070 - val_loss: 0.4223 - val_binary_accuracy: 0.8502 - val_auc: 0.5097\n",
            "Epoch 3/3\n",
            "12676/12676 [==============================] - 141s 10ms/step - loss: 0.4227 - binary_accuracy: 0.8500 - auc: 0.5073 - val_loss: 0.4222 - val_binary_accuracy: 0.8502 - val_auc: 0.5099\n"
          ]
        }
      ],
      "source": [
        "FEATURE_NAMES = [f\"f{i}\" for i in range(12)]\n",
        "TREATMENT_NAME = \"treatment\"\n",
        "\n",
        "def preprocess(inputs: dict[str, tf.Tensor]) -\u003e tuple[tf.Tensor, tf.Tensor]:\n",
        "  features = tf.stack([inputs[name] for name in FEATURE_NAMES], axis=-1)\n",
        "  label = inputs[TREATMENT_NAME]\n",
        "  return features, label\n",
        "\n",
        "class Classifier(tf.keras.Model):\n",
        "  def __init__(self):\n",
        "    super().__init__()\n",
        "    self._mlp = tf.keras.Sequential([\n",
        "        tf.keras.layers.Dense(64, activation=\"relu\"),\n",
        "        tf.keras.layers.Dense(32, activation=\"relu\"),\n",
        "        tf.keras.layers.Dense(1)\n",
        "    ])\n",
        "\n",
        "  def call(self, inputs: tf.Tensor) -\u003e tf.Tensor:\n",
        "    return self._mlp(inputs)\n",
        "\n",
        "classifier = Classifier()\n",
        "classifier.compile(\n",
        "    optimizer=tf.keras.optimizers.SGD(),\n",
        "    loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),\n",
        "    metrics=[\n",
        "        tf.keras.metrics.BinaryAccuracy(),\n",
        "        tf.keras.metrics.AUC(curve=\"ROC\", from_logits=True),\n",
        "    ]\n",
        ")\n",
        "\n",
        "classifier.fit(\n",
        "    train_dataset.map(preprocess).batch(1024),\n",
        "    validation_data=test_dataset.map(preprocess).batch(1024),\n",
        "    epochs=3,\n",
        ");"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Y0M9etg4ur5P"
      },
      "source": [
        "The AUC value on the test split is indeed 0.5, indicating that the model cannot distinguish between examples in the control and treatment group and therefore does no better than random guessing. This validates the randomized control trial setting and ensures we have unbiased data that is perfect for uplift modeling!"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Fj9pqFESPgy3"
      },
      "source": [
        "# Uplift Modeling\n",
        "\n",
        "The initial release of the uplift modeling library focuses on the family of models that follow the two tower uplift network architecture illustrated below. The library is written in Keras and is designed in a modular, layered manner such that it can easily be extended with custom layers and components. We offer a suite of tools (losses, metrics etc.) that can be hooked up with any Keras-compatible training framework (like Keras' training [API](https://keras.io/api/models/model_training_apis/), [Orbit](https://www.tensorflow.org/tfmodels/orbit) and [TFRS](https://www.tensorflow.org/recommenders)) in order to train an uplift model on potentially billions of datapoints.\n",
        "\n",
        "The two tower uplift model is composed of the following components:\n",
        "- Inputs: a mapping from feature names to feature tensors. The tensors can be of different types, eg `tf.Tensor`, `tf.SparseTensor` and `tf.RaggedTensor`.\n",
        "- Backbone: a trainable network that computes an embedding from the inputs shared between the control and treatment arms.\n",
        "- Control and treatment feature encoders: trainable networks that compute embeddings from control and treatment speficic features.\n",
        "- Control and treatment feature combiners: methods to combine the backbone's shared embedding with the control/treatment specific embeddings.\n",
        "- Control tower: trainable network with zero or more hidden layers that learns from control examples only.\n",
        "- Treatment tower: trainable network with zero or more hidden layers that learns from treatment examples only.\n",
        "- Logits head: computes control and treatment logits. At training time, the gradient flows from the control logits for control examples and from the treatment logits for the treatment examples.\n",
        "- Model outputs: contains the predicted control and treatment outcomes. The uplift is computed as the difference between the predicted treatment and control outcomes.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "PvyTGPkUTEUU"
      },
      "source": [
        "![model4.png]()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Vx-zXSbDacY3"
      },
      "source": [
        "Since we are interested in measuring the increase in probability of a visit occuring from the treatment, we will train an uplift model using the binary crossentropy loss. The treatment and control heads are two seperate classification heads that estimate the probability of a visit occuring with and without the treatment respectively. The uplift is then computed as the difference of the estimated treatment and control visit probabilities."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "executionInfo": {
          "elapsed": 509462,
          "status": "ok",
          "timestamp": 1712878043141,
          "user": {
            "displayName": "",
            "userId": ""
          },
          "user_tz": 420
        },
        "id": "wC_ss1fCPhyP",
        "outputId": "62e22a79-7d81-4cee-8066-717d0266f87f"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Epoch 1/3\n",
            "12676/12676 [==============================] - 169s 12ms/step - loss: 0.1194 - treatment_fraction: 0.8500 - uplift/mean: 0.0045 - uplift/mean/control: 0.0016 - uplift/mean/treatment: 0.0022 - label/mean: 0.0470 - label/mean/control: 0.0384 - label/mean/treatment: 0.0485 - val_loss: 0.1134 - val_treatment_fraction: 0.8502 - val_uplift/mean: 0.0055 - val_uplift/mean/control: 0.0051 - val_uplift/mean/treatment: 0.0056 - val_label/mean: 0.0467 - val_label/mean/control: 0.0379 - val_label/mean/treatment: 0.0483\n",
            "Epoch 2/3\n",
            "12676/12676 [==============================] - 170s 13ms/step - loss: 0.1143 - treatment_fraction: 0.8500 - uplift/mean: 0.0066 - uplift/mean/control: 0.0058 - uplift/mean/treatment: 0.0064 - label/mean: 0.0470 - label/mean/control: 0.0384 - label/mean/treatment: 0.0485 - val_loss: 0.1105 - val_treatment_fraction: 0.8502 - val_uplift/mean: 0.0069 - val_uplift/mean/control: 0.0064 - val_uplift/mean/treatment: 0.0070 - val_label/mean: 0.0467 - val_label/mean/control: 0.0379 - val_label/mean/treatment: 0.0483\n",
            "Epoch 3/3\n",
            "12676/12676 [==============================] - 170s 12ms/step - loss: 0.1125 - treatment_fraction: 0.8500 - uplift/mean: 0.0070 - uplift/mean/control: 0.0064 - uplift/mean/treatment: 0.0071 - label/mean: 0.0470 - label/mean/control: 0.0384 - label/mean/treatment: 0.0485 - val_loss: 0.1093 - val_treatment_fraction: 0.8502 - val_uplift/mean: 0.0062 - val_uplift/mean/control: 0.0057 - val_uplift/mean/treatment: 0.0063 - val_label/mean: 0.0467 - val_label/mean/control: 0.0379 - val_label/mean/treatment: 0.0483\n"
          ]
        }
      ],
      "source": [
        "FEATURE_NAMES = [f\"f{i}\" for i in range(12)]\n",
        "TREATMENT_NAME = \"treatment\"\n",
        "LABEL_NAME = \"visit\"\n",
        "\n",
        "def preprocess(inputs: dict[str, tf.Tensor]) -\u003e dict[str, tf.Tensor]:\n",
        "  inputs = tf.nest.map_structure(lambda x: tf.expand_dims(x, axis=-1), inputs)\n",
        "  features = {name: inputs[name] for name in FEATURE_NAMES}\n",
        "  features[TREATMENT_NAME] = inputs[TREATMENT_NAME]\n",
        "  label = tf.cast(inputs[LABEL_NAME], tf.float32)\n",
        "  return features, label\n",
        "\n",
        "uplift_network = two_tower_uplift_network.TwoTowerUpliftNetwork(\n",
        "    backbone=tf.keras.Sequential([\n",
        "        concat_features.ConcatFeatures(feature_names=FEATURE_NAMES),\n",
        "        tf.keras.layers.Dense(64, activation=\"relu\"),\n",
        "        tf.keras.layers.Dropout(0.1),\n",
        "        tf.keras.layers.Dense(32, activation=\"relu\"),\n",
        "        tf.keras.layers.Dropout(0.1),\n",
        "    ]),\n",
        "    control_tower=tf.keras.Sequential([\n",
        "        tf.keras.layers.Dense(16, activation=\"relu\"),\n",
        "        tf.keras.layers.Dropout(0.1),\n",
        "    ]),\n",
        "    treatment_tower=tf.keras.Sequential([\n",
        "        tf.keras.layers.Dense(16, activation=\"relu\"),\n",
        "        tf.keras.layers.Dropout(0.1),\n",
        "    ]),\n",
        "    logits_head=two_tower_logits_head.TwoTowerLogitsHead(\n",
        "        control_head=tf.keras.layers.Dense(1),\n",
        "        treatment_head=tf.keras.layers.Dense(1),\n",
        "    ),\n",
        ")\n",
        "\n",
        "uplift_model = two_tower_uplift_model.TwoTowerUpliftModel(\n",
        "  treatment_indicator_feature_name=TREATMENT_NAME,\n",
        "  uplift_network=uplift_network,\n",
        "  inverse_link_fn=tf.math.sigmoid,\n",
        ")\n",
        "\n",
        "uplift_model.compile(\n",
        "  optimizer=tf.keras.optimizers.Adagrad(learning_rate=0.05),\n",
        "  loss=true_logits_loss.TrueLogitsLoss(\n",
        "      loss_fn=tf.keras.losses.binary_crossentropy,\n",
        "      from_logits=True,\n",
        "  ),\n",
        "  metrics=[\n",
        "    treatment_fraction.TreatmentFraction(),\n",
        "    uplift_mean.UpliftMean(),\n",
        "    label_mean.LabelMean(),\n",
        "  ],\n",
        ")\n",
        "\n",
        "uplift_model.fit(\n",
        "    train_dataset.map(preprocess).batch(1024),\n",
        "    validation_data=test_dataset.map(preprocess).batch(1024),\n",
        "    epochs=3,\n",
        ");"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "gAqAN6aTVEfJ"
      },
      "source": [
        "# Uplift Evaluation\n",
        "\n",
        "There are various ways to evaluate uplift models. The *uplift curve* is a powerful visual tool that demonstrates the effectiveness of an uplift model in identifying the right users to target, compared to simply using random selection. While there are different versions of uplift curve, we will focus on the absolute cumulative uplift curve (introduced in Equation 17 of [[3](https://proceedings.mlr.press/v67/gutierrez17a/gutierrez17a.pdf)]) because of its relative simplicity.\n",
        "\n",
        "As stated before, the goal of an uplift model is to identify the set of users whose likelihood of visiting increases the most when exposed to the treatment. For any number of users *n*, we can estimate the expected number of incremental visits ($\\Delta$V) if *n* users were to be treated by:\n",
        "\n",
        "$$\\Delta V(n) =  (\\frac{\\sum_{i=1}^n{V^T}}{N^T(n)} - \\frac{\\sum_{i=1}^n{V^C}}{N^C(n)}) \\cdot n $$\n",
        "\n",
        "where $N^T(n)$ is the number of treatment examples amongst the *n* individuals and $N^C(n)$ is the number of control examples amongst the *n* individuals.\n",
        "\n",
        "To compute the uplift curve we sort the test dataset in descending order of the predicted uplift, and compute the expected number of incremental visits if the top *n* users were to be treated, where *n* ranges from one to the entire test dataset. Since a good uplift model will sort the users with the highest treatment effect first, we would expect the uplift curve to show that the majority of incremental visits can be captured by treating just a small portion of targeted individuals. In particular, we would expect the number of incremental visits to always be greater than the incremental visits gained by random selection (which we can visualize by *not* sorting the test dataset)."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "hyfv6Tn3Fq7Z"
      },
      "outputs": [],
      "source": [
        "def uplift_curve(visit: np.ndarray, treatment: np.ndarray, uplift: np.ndarray | None = None) -\u003e np.ndarray:\n",
        "  \"\"\"Computes the incremental visits by different number of treated individuals.\"\"\"\n",
        "  # Sort by the uplift predictions if given. Otherwise the computed uplift curve\n",
        "  # will be that of a random selection strategy.\n",
        "  if uplift is not None:\n",
        "    sorted_indices = np.argsort(uplift)[::-1]\n",
        "    visit, treatment = visit[sorted_indices], treatment[sorted_indices]\n",
        "\n",
        "  # Compute the cumulative number of control and treatment visits.\n",
        "  ctrl_visit, trmt_visit = visit.copy(), visit.copy()\n",
        "  ctrl_visit[treatment == 1] = 0\n",
        "  trmt_visit[treatment == 0] = 0\n",
        "  ctrl_visits = np.cumsum(ctrl_visit)\n",
        "  trmt_visits = np.cumsum(trmt_visit)\n",
        "\n",
        "  # Compute the cumulative number of control and treatment individuals.\n",
        "  num_ctrl = np.cumsum(treatment == 0)\n",
        "  num_trmt = np.cumsum(treatment == 1)\n",
        "\n",
        "  # Compute the visit rate for top n individuals, with n ranging from 1 to all.\n",
        "  avg_ctrl_visits = np.divide(ctrl_visits, num_ctrl, out=np.zeros_like(ctrl_visits, dtype=np.float32), where=num_ctrl \u003e 0)\n",
        "  avg_trmt_visits = np.divide(trmt_visits, num_trmt, out=np.zeros_like(trmt_visits, dtype=np.float32), where=num_trmt \u003e 0)\n",
        "\n",
        "  # Estimate the expected number of incremental visits.\n",
        "  avg_treatment_effect = avg_trmt_visits - avg_ctrl_visits\n",
        "  expected_incremental_visits = avg_treatment_effect * (num_trmt + num_ctrl)\n",
        "  return expected_incremental_visits"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "XPIqu1OcCaEf"
      },
      "outputs": [],
      "source": [
        "# Extract label and treatment indicator from test data.\n",
        "selector = lambda x: {TREATMENT_NAME: x[TREATMENT_NAME], LABEL_NAME: x[LABEL_NAME]}\n",
        "test_df = tfds.as_dataframe(test_dataset.map(selector))\n",
        "visit = test_df[LABEL_NAME].to_numpy().astype(np.int64)\n",
        "treatment = test_df[TREATMENT_NAME].to_numpy().astype(np.int64)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "executionInfo": {
          "elapsed": 17771,
          "status": "ok",
          "timestamp": 1712878216327,
          "user": {
            "displayName": "",
            "userId": ""
          },
          "user_tz": 420
        },
        "id": "StBY-H2PgN0O",
        "outputId": "872fd6e0-5edb-4d99-eaba-2e09c436542d"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "977/977 [==============================] - 17s 13ms/step\n"
          ]
        }
      ],
      "source": [
        "# Compute uplift predictions on the test dataset.\n",
        "predictions = uplift_model.predict(test_dataset.map(preprocess).batch(1024))\n",
        "uplift_predictions = predictions[\"uplift_predictions\"].squeeze()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "IrpPIGmMNUQ2"
      },
      "outputs": [],
      "source": [
        "# Compute incremental visists for random selection and for uplift targeting.\n",
        "random_incremental_visits = uplift_curve(visit, treatment)\n",
        "uplift_incremental_visits = uplift_curve(visit, treatment, uplift_predictions)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "height": 511
        },
        "executionInfo": {
          "elapsed": 755,
          "status": "ok",
          "timestamp": 1712878217541,
          "user": {
            "displayName": "",
            "userId": ""
          },
          "user_tz": 420
        },
        "id": "VZDIeXjlMJ5v",
        "outputId": "57e0149c-bdd6-4c4d-f730-1fd52dc6487e"
      },
      "outputs": [
        {
          "data": {
            "image/png": "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\nJEmSJEmSpHLlZkoqOY++/WlW+5f7bFz8EE9flr+/S28o0sc7JEmSJEmS6nPiiScSQmDKlClL+6ZM\nmUIIgRNPPDFn/gcffMBhhx1G7969CSHQvXv3omUtVfn+DJQcV4Cr5FVUFLHgXF0Nl65S+/gv3ite\nFkmSJEmSpAQtXryYQw89lAkTJnDcccex9tpr07FjRwD69u0L0OwiblLnaUkqKysZOnQoo0aNYuDA\ngWnHKTsWwFVSCn3X2Fq9/neo+ghGXVH7HLc+kSRJkiRJrcBaa63F+PHj6datW1b/5MmTeeeddzj5\n5JO57bbbUkpXeq666irOO+881lprrbSjlCQL4CopVz3yblb7ysO+V/iLjv41jL6y7jlrbuXWJ5Ik\nSZIkqVVo164dm2yySU7/J598AsCaa65Z7EglbY011mCNNdZIO0bJcg9wlZTb/jspq/397dYp/EXr\nK36f/DScMqrwOSRJkiRJUkkZPXo0IQQqKyvzjvft23fpliEAd955JyEE7rzzTh5++GF23HFHOnfu\nzCqrrMKRRx7JBx980KDr5tsDPITAbrvtBsDQoUMJIRBCYODAgYQQmDp1KlOnTl3aX9se4vW91vrO\nM2zYMH7wgx+w0UYb0blzZ7p06cKAAQO48cYbqa6uzjnvkv21J02axE033cTmm2/OSiutlLUVyfvv\nv88RRxzBKqusQufOndlxxx15+OGHs76fK/roo48488wz6devHx06dKBnz54cfPDBvPLKK1nz+vbt\ny9ChQwHYfffds17Xihlr24d9ypQpHHPMMfTq1YuOHTuy9dZbM2LEiLzfx6qqKgYPHrx0e5pNNtmE\n6667jkmTJjX6z6RUuAJcao7KbrWPnTsZOvUoXhZJkiRJkiTggQce4JFHHuGwww5j4MCBvP7669x/\n//2MGjWK559/no033rjR5xwyZAhTpkzhrrvuYrfddltaQO7bty8DBw7k+uuvB2Dw4MFLj9lyyy0b\nfP6+ffsyZMiQes9z3nnnUVFRwXbbbcdaa61FVVUVTz/9NGeddRavvPIK99xzT97zn3XWWYwZM4ZB\ngwZxwAEH0KZNGwDeffdddtppJ2bOnMmgQYPYfPPNmTRpEocddhgHHHBA3nONGzeOffbZh5kzZ7Lv\nvvty+OGH8+WXXzJs2DB23nlnHnzwwaXHDh48mGHDhvHMM89wwgknZP3CoiGmTp3KtttuS79+/Tju\nuOOYOXMm9913H4cccghPPvkku++++9K58+fPZ4899mDcuHH079+fY489lqqqKq644grGjBnTqOuW\nEgvgUlP979+1j+38c4vfkiRJkiQpFQ899BAPPfQQBx544NK+G264gcGDB3P66afz1FNPNfqclZWV\njB49mrvuuouBAwfmrEpfskq6ttXq9enbty+VlZX1nufhhx9m/fXXz+qrrq7mhz/8IXfffTdnnnkm\n2223Xc5x48aN47XXXmO99dbL6j/jjDOYOXMmt956Kz/5yU+W9j/yyCN5C+CLFi3i//7v//jmm28Y\nNWrU0lXxkNkiZptttuGkk05iypQpdOjQgcGDBzNr1iyeeeYZTjzxxEbfBHP06NFUVlYyZMiQpX3f\n//732W+//bjmmmuyCuDXXHMN48aN45hjjuHvf//70lXmF154IVtttVWjrltKLIBLTXX/SbWP7VVZ\ntBiSJEmSJJWTvuc9nHaEBpty9aBUrrvHHntkFb8BzjzzTG666Saefvpppk6dyrrrrptKtuZasfgN\nUFFRwVlnncXdd9/NY489lrcAfu655+YUv6dNm8bTTz/NBhtswKmnnpo1tv/++7PXXnvx5JNPZvU/\n/PDDTJw4kV/84hdZxW/I7I1+7rnnMnjwYJ566qlaV5A3xrrrrstFF12U1bfvvvuyzjrr8PLLL2f1\n33XXXVRUVHDVVVdlbbHSp08fBg8enHOecmEBXGqKP+2Z23fJV7B4AbRbqfh5JEmSJEmSaqxYmAVo\n06YNO++8MxMnTuS1115rtQXwGTNmcM011zBy5EgmTZrEnDlzssY//vjjvMdtu+22OX2vv/46ADvs\nsAMVFbm3Stx5551zCuAvvPACkNmaJN8q9SX7rI8fPz6RAviWW265dLuW5fXp02dpFoCvv/6aiRMn\n0qdPn7zbrOy8887NztJaWQCXmuLjV3P7KiqgwuK3JEmSJElK1+qrr563v3fv3kDmRomt0axZs9hm\nm22YPHky2267Lccffzw9evSgbdu2zJo1ixtuuIEFCxbkPXbJa1/eku9Dbd+vfP0zZswA4F//+led\nWb/55ps6xxuqe/fuefvbtm2bddPPr7/+GmjcaykXFsBVsn6+10aFOXG+G1+emacgLkmSJEmSEpfW\ntiJpWLIqedGiRXnHq6qq6NYtt07x2Wef5Z3/6aefAuQ9pjW4/fbbmTx5MkOGDMlZff3CCy9www03\n1Hrs8luCLNG1a1eg9u9Xvv4l37vhw4dz8MEHNzR6wTXltZSL3LX9Uok4eMs1kz3hzEn5i99DZkGv\nDZO9liRJkiRJKnurrLIKkNmrekUTJkxg1qxZeY975plncvoWL17Ms88+C0D//v2TC1mjTZs2LF68\nuKDnmTBhAgBHHHFEzli+11yfJd+HF154IWs19RJLvl/L23777QEYM2ZMg6+zZAuTJL4/tenatSv9\n+vXj448/ZsqUKTnj+V5LubAArpI1Z0H+3442SWU3uLGWvxzy/AZRkiRJkiSpuTbZZBO6du3K8OHD\n+fzzz5f2z5s3j5/97Ge1Hvf0008zYsSIrL6bb76ZiRMnsvvuuxdk/++ePXvyxRdfMG/evIKdZ8ne\n1qNHj87qf+2117jqqqsafa0+ffowcOBAJkyYwB//+MessUcffTRn/2+AQw45hPXXX59bbrmFkSNH\n5j3vCy+8wNy5c5e2e/bsCcCHH37Y6IyNcfzxx1NdXc35559PjHFp/7Rp07j++usLeu2WzC1QVDIW\nLMr+Ldr6q3Zp3gnnV8Ezv4EXbq59zoXl+/ERSZIkSZJUWO3ateOss87isssuo3///hx22GEsWrSI\nJ554gjXXXJM118z/6feDDjqIww47jMMOO4wNNtiAN954g5EjR9KjRw9uvfXWgmTdc889eeWVV9hv\nv/3Ydddd6dChA1tssQUHHXRQYuc5/vjjueaaaxg8eDCjRo1iww035IMPPmDEiBEcfvjh3HfffY3O\nfcstt7DTTjtx+umnM3LkSDbffHMmTZrE/fffzyGHHMLw4cOzbpDZrl07HnjgAfbdd18GDRrEjjvu\nyJZbbkmnTp2YNm0ar7zyCpMmTWL69Ol06tQJgN13352KigrOP/983nrrraUr+y+66KJG563Lueee\ny7Bhw7j33nt577332GeffaiqquKf//wnu+66K8OGDct7s89SZwFcJWP6rPlZ7ZXa594ht8EWzIar\n16l/XruOTb+GJEmSJElSPYYOHUqnTp3405/+xG233Ubv3r055phjqKysZLPNNst7zOGHH84pp5zC\nFVdcwcMPP0y7du04/PDDueqqq9hoo8LcM+2iiy5i1qxZPPTQQzz33HMsXryYE044odEF8LrOs+aa\nazJmzBjOO+88nn32WR577DE22WQTbr31Vvbaa68mFcA322wzXnjhBS644AKefvppnn76aTbffHMe\n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\n7bXp2LEjm2yyCddddx2TJk3K+V6myRXgKYsxTgN+mHYOSZIkSZIktUwTJ05ku+22Y6ONNuLYY49l\n3rx5dO3aldtuu40HH3yQ3Xbbjb322ovFixczbtw4rrvuOh555BFeeuklVl555ZzzjRgxguHDh7P/\n/vtz2mmn8c477zBy5EheeeUV3nnnHXr16rV07gcffMAOO+zAjBkz2H///dlyyy2ZMGEChx56KPvv\nv3/evCNGjOCII44gxsiRRx7Juuuuy9ixY/n973/P8OHDee655/Luvf2LX/yC0aNHc9BBB7HPPvvw\nn//8hwsvvJBvv/2WHj16cN5553HooYeyyy678MQTT3DLLbewePFifv/73zfq+9m3b1+GDBnC9ddf\nD8DgwYOXjm255ZZLn5933nlUVFSw3XbbsdZaa1FVVcXTTz/NWWedxSuvvMI999yT9/xnnXUWY8aM\nYdCgQRxwwAG0adMGgHfffZeddtqJmTNnMmjQIDbffHMmTZrEYYcdxgEHHJD3XOPGjWOfffZh5syZ\n7Lvvvhx++OF8+eWXDBs2jJ133pkHH3xw6bGDBw9m2LBhPPPMM5xwwgmN3t986tSpbLvttvTr14/j\njjuOmTNnct9993HIIYfw5JNPsvvuuy+dO3/+fPbYYw/GjRtH//79OfbYY6mqquKKK65gzJgxjbpu\nwcUY/SrBL2DsVlttFSVJkiRJklqTd955J77zzjtpx2gRJk+eHIEIxPPPPz9nfMqUKXHRokU5/bff\nfnsE4tVXX53Vf8cdd0QgtmnTJj755JNZY+edd14E4q9//eus/r333jsC8frrr8/qHzZs2NJsd9xx\nx9L+2bNnx549e8aKior43//+N+uYq6++OgJx7733zuo/4YQTIhDXXXfd+NFHHy3t/+qrr2LPnj1j\np06dYq9evbL+u5g/f37cdNNNY/v27eNnn32W8z1oiHXXXTeuu+66tY5PmDAhp2/x4sXx+OOPj0B8\n8cUX876ONddcM06aNCnn2D322CMC8dZbb83qHzlyZN7v5cKFC+P6668fO3ToEEePHp11zMcffxzX\nXHPN2Lt37zh//vyl/UOGDIlAHDVqVN7XtCTj5MmTl/Yt/99ZZWVl1vxHH300AnH//ffP6r/00ksj\nEI855phYXV29tP/DDz+MvXr1ikA84YQT8mZYXkPf71tttVUExsYm1EldAS5JkiRJkqTWo7Jb2gka\nrrIqkdOsvvrqDBkyJKd/3XXXzTv/Rz/6EWeffTaPPfYYv/rVr3LGjznmGPbcc8+svlNOOYWrr76a\nl19+eWnfRx99xBNPPMF6663HmWeemTX/kEMOYbfdduOZZ57J6h8+fDgzZszg//2//8cuu+ySNXbO\nOefwhz/8gSeeeIIPP/yQddZZJ2v84osvzro5Y/fu3Tn44IO54447OOecc9h0002XjnXo0IGjjz6a\nyspKxo8fz2qrrZb3e9Ec66+/fk5fRUUFZ511FnfffTePPfYY2223Xc6cc889l/XWWy+rb9q0aTz9\n9NNssMEGnHrqqVlj+++/P3vttRdPPvlkVv/DDz/MxIkT+cUvfsFuu+2WNbbmmmty7rnnMnjwYJ56\n6qlaV5A3xrrrrstFF12U1bfvvvuyzjrrZP13AXDXXXdRUVHBVVddlbXFSp8+fRg8eHDOedJkAVyS\nJEmSJElqwbbYYgs6dOiQ079w4UL++Mc/cu+99/LOO+9QVVWVtTf1xx9/nPd8W2+9dU5fnz59ALL2\nDn/ttdcA2HnnnZdu47G8gQMH5hTAx40bB8Aee+yRM79t27bsuuuuTJkyhddeey2nAJ4v15prrgnA\ngAEDcsaWFMs/+uijnLEkzJgxg2uuuYaRI0cyadIk5syZkzVe2/d32223zel7/fXXAdhhhx2oqMi9\nLePOO++cUwB/4YUXgMzWJJWVlTnHfPDBBwCMHz8+kQL4lltumffPuU+fPkuzAHz99ddMnDiRPn36\n5N1mZeedd252liRZAJckSZIkSZJasN69e+ftP/roo3nwwQfp168fhxxyCL17915aKL/++utZsGBB\n3uO6d++e09e2baZMuHjx4qV9VVWZFeyrr756g3MtOWaNNdbIe8yS/lmzZuWMdeuWu7p/Sa66xhYu\nXJj3Ws0xa9YsttlmGyZPnsy2227L8ccfT48ePWjbti2zZs3ihhtuqPX7W9f3pbbvZb7+GTNmAJmb\nf9blm2++qXO8ofL9dwGZ7/Pyv1j5+uuvgca9ljRZAJckSZIkSVLrkdC2Iq3J8ltMLPHqq6/y4IMP\nstdeezFy5EjatWu3dKy6uprf/OY3zb7ukqLzZ599lnf8008/rfWYfGMA06dPz5rXUt1+++1MnjyZ\nIUOG5Ky+fuGFF7jhhhtqPTbfn1fXrl2B2r+X+fqXfI+GDx/OwQcf3NDoBdeU15Km3PX2kiRJkiRJ\nklq0CRMmAHDwwQdnFb8BXn75ZebNm9fsa/Tv3x+AZ599Nmtl+BKjR4+u9Zh8Y4sWLeLZZ58FYKut\ntmp2vuZq06ZN3tcFy76/RxxxRM7Yitu+NMSS78sLL7yQtZp6iSXfl+Vtv/32AIwZM6bB11myhUlt\nrysJXbt2pV+/fnz88cdMmTIlZzzfa0mTBXBJkiRJkiSplVmy9/KKhebPP/+cM844I5FrrL322uy9\n995MnjyZm2++OWts+PDheQvBhx56KD169OAf//gHL774YtbY9ddfz6RJk9hrr71y9v9OQ8+ePfni\niy/y/rKgtu/va6+9xlVXXdXoa/Xp04eBAwcyYcIE/vjHP2aNPfroozn7f0PmRqPrr78+t9xyCyNH\njsx73hdeeIG5c+cubffs2ROADz/8sNEZG+P444+nurqa888/nxjj0v5p06Zx/fXXF/TajeUWKJIk\nSZIkSVIrs80227DTTjvxwAMPsOOOO7Lzzjvz2Wef8cgjj7DxxhsvvXlkc91yyy3ssMMODB48mMcf\nf5wtttiCCRMm8OCDD3LQQQfx0EMPZc3v0qULf/nLXzjqqKPYbbfdOOqoo1hnnXUYO3Ysjz/+OL17\n984pAKdlzz335JVXXmG//fZj1113pUOHDmyxxRYcdNBBHH/88VxzzTUMHjyYUaNGseGGG/LBBx8w\nYsQIDj/8cO67775GX++WW25hp5124vTTT2fkyJFsvvnmTJo0ifvvv59DDjmE4cOHZ90gs127djzw\nwAPsu+++DBo0iB133JEtt9ySTp06MW3aNF555RUmTZrE9OnT6dSpEwC77747FRUVnH/++bz11lus\nssoqAFx00UXJfNNqnHvuuQwbNox7772X9957j3322Yeqqir++c9/suuuuzJs2LC8N/tMQ8tIIUmS\nJEmSJKnB2rRpw3/+8x9+8pOf8Mknn3DjjTfy7LPP8uMf/5jHHnssZ1uUptpwww158cUXOeKII3ju\nuee44YYbmDZtGsOGDePwww/Pe8whhxzCc889xwEHHMBjjz3Gtddey/jx4znttNMYO3Ys/fr1SyRb\nc1100UWcdtppTJw4kauuuoqLL76Y+++/H4A111yTMWPGMGjQIJ599lluvvlmpk6dyq233srVV1/d\npOttttlmvPDCCxx22GGMGTOG66+/nilTpvDggw+y8847A8v2115i880354033uBXv/oVVVVV3HHH\nHfz+979n7Nix9O/fn3vuuYdevXotnb/pppty11130bt3b2699VYuvvhiLr744iZ+h2q30korMWrU\nKH7605/y6aef8rvf/Y5Ro0ZxwQUXcP755+d9LWkJyy9RV+kIIYzdaquttho7dmzaUSRJkiRJkhps\n/PjxQKaQJ5WLY489lr///e+8++67bLzxxmnHaZY//elPnHLKKfzhD3/g1FNPrXNuQ9/vAwYMYNy4\nceNijAMam8cV4JIkSZIkSZJUYNXV1Xz66ac5/U899RT33Xcfm222Wasqfn/yySc5fdOmTeOyyy6j\nbdu2HHjggSmkyuUe4JIkSZIkSZJUYN9++y19+vRh9913Z5NNNqFt27a8/fbbPPHEE7Rv355bbrkl\n7YiNcsQRR7Bw4UIGDBhA9+7dmTJlCiNGjGDu3LlcddVVrLXWWmlHBCyAS5IkSZIkSSoBlZWVDZp3\n6KGHsuWWWxY0Sz7t2rXjtNNO4+mnn+all15i7ty59OrVi6OOOorzzjuP/v37Fz1Tcxx33HHcc889\n3H///VRVVdGlSxe22247zjzzzFr3h0+DBXBJkiRJkiRJrd7QoUMbNK9v376pFMDbtGnDTTfdVPTr\nFsrpp5/O6aefnnaMelkAlyRJkiRJktTqxRjTjqAWyJtgSpIkSZIkSZJKkgVwSZIkSZIkSVJJsgAu\nSZIkSZIkSSqqYm1ZYwFckiRJkiRJLUYIAYDq6uqUk0gqpCUF8CXv+UKxAC5JkiRJkqQWo0OHDgDM\nmTMn5SSSCmnJe3zJe75QLIBLkiRJkiSpxVh55ZUB+PTTT5k9ezbV1dVF2ypBUmHFGKmurmb27Nl8\n+umnwLL3fKG0LejZJUmSJEmSpEbo0aMHc+bMYe7cuXz00Udpx5FUQJ06daJHjx4FvYYFcEmSJEmS\nJLUYFRUV9OnTh5kzZzJ79mwWLFjgCnCphIQQ6NChAyuvvDI9evSgoqKwm5RYAJckSZIkSVKLUlFR\nQa9evejVq1faUSS1cu4BLkmSJEmSJEkqSRbAJUmSJEmSJEklyQK4JEmSJEmSJKkkWQCXJEmSJEmS\nJJUkC+CSJEmSJEmSpJJkAVySJEmSJEmSVJIsgEuSJEmSJEmSSlKIMaadQQUQQpix0kor9dh0003T\njiJJkiRJkiRJTTZ+/HjmzZs3M8bYs7HHWgAvUSGEyUBXYErKUYppk5rHd1NNISkJvp+l0uB7WSoN\nvpel0uH7WSoN5fhe7gt8HWNcr7EHWgBXyQghjAWIMQ5IO4uk5vH9LJUG38tSafC9LJUO389SafC9\n3DjuAS5JkiRJkiRJKkkWwCVJkiRJkiRJJckCuCRJkiRJkiSpJFkAlyRJkiRJkiSVJAvgkiRJkiRJ\nkqSSFGKMaWeQJEmSJEmSJClxrgCXJEmSJEmSJJUkC+CSJEmSJEmSpJJkAVySJEmSJEmSVJIsgEuS\nJEmSJEmSSpIFcEmSJEmSJElSSbIALkmSJEmSJEkqSRbAJUmSJEmSJEklyQK4WrQQwtohhL+EED4J\nISwIIUwJIVwfQlgljfNIaprmvgdDCD1DCD8OITwYQpgQQpgXQqgKITwbQjgphODfZ1KRFOLv1BDC\ncSGEWPP14yTzSsovyfdyCGGXEML9IYTpNeeaHkJ4PIRwQCGyS1omwX8zD6p5335U87P2pBDCv0II\nOxQqu6RlQghHhhBuCiGMCSF8XfNz8V+beC5rYCsIMca0M0h5hRDWB54HVgOGA+8C2wK7A+8BO8UY\nZxTrPJKaJon3YAjhNOD3wHRgFPAhsDpwONANuB84KvqXmlRQhfg7NYTQB/gf0AboApwcY7w9ydyS\nsiX5Xg4hXARcBnwJjCDzd3UvoD8wKsZ4buIvQBKQ6L+Zfw2cC8wAhpF5P28AHAy0BY6PMTapECep\nYUIIrwNbAN8AHwGbAH+LMf6gkeexBpaHBXC1WCGEx4B9gJ/FGG9arv864OfAH2OMpxXrPJKaJon3\nYAhhD6Az8HCMsXq5/t7Ay0Af4MgY4/0FeAmSaiT9d2oIIQBPAOsBDwC/wAK4VHAJ/px9FPBP4Eng\n8Bjj7BXG28UYFyYaXtJSCf2c3Rv4GPgC2DzG+PlyY7sDTwOTY4z9CvASJNWoeb99BEwAdiOz8Ksp\nBXBrYHlYAFeLFELoB0wEpgDrr1DwWpnMypIArBZjnFPo80hqmmK8B0MIFwBXADfHGH/a7NCS8irE\n+zmEcBbwO2AgsAcwBAvgUkEl+HN2BZl/pK8O9I0xflHI3JKyJfhe3g54EfhPjPGQPONfk6kdrZzs\nK5BUmxDCQJpQALcGVjv3TFVLtUfN4+PLv2EBalaWPAd0ArYv0nkkNU0x3oNLVpYtasY5JNUv0fdz\nCGFT4Grghhjjf5MMKqlOSb2XdyTz6Y2RwFc1+wf/KoRwlnsGS0WR1Hv5A+BbYNsQQq/lB0IIuwIr\nk/mUh6SWzxpYLSyAq6XauObx/VrGP6h53KhI55HUNAV9D4YQ2gLH1zQfbco5JDVYYu/nmvfuPWT2\n87+g+dEkNUJS7+Vtah4/A8aR2f/7auB64PkQwjMhhFWbkVNS3RJ5L8cYZwK/IvNpjndCCLeFEK4K\nIfwTeJzMVmWnJpBXUuFZA6tF27QDSLXoVvNYVcv4kv7uRTqPpKYp9HvwauC7wMgY42NNPIekhkny\n/XwJmRvk7RxjnNfMXJIaJ6n38mo1j6cBk4G9gJeAdYHfAvsC/yKzxZGk5CX293KM8foQwhTgL8DJ\nyw1NAO5cfl9wSS2aNbBauAJcrVWoeWzuJvZJnUdS0zT5PRhC+BlwDpm7Wh+XZChJTdKg93MIYVsy\nq75/G2N8oeCpJDVWQ/9ubrPc/CNjjE/FGL+JMb4NHEbmRl67uR2KlJoG/5wdQjgX+DdwJ7A+mZvP\nDwAmAX8LIfymQBklFVfZ1sAsgKulWvJbqW61jHddYV6hzyOpaQryHgwhnAHcALwD7F7z0U1JhdXs\n9/NyW5+8D1ycXDRJjZDU381f1TxOijG+sfxAzSc7lnwya9tGJ5TUEIm8l2tutvdrMjfBPDvGOCnG\nODfGOI7ML7M+Bs6pubmepJbNGlgtLICrpXqv5rG2fYk2rHmsbV+jpM8jqWkSfw+GEAYDNwNvkSl+\nf9rkdJIaI4n3c5ea4zcF5ocQ4pIvYEjNnD/V9F3f3MCS8kr65+xZtYwvKZCv1LBYkhopqffygTWP\no1YciDHOBV4mUzvq39iAkorOGlgt3ANcLdWSv3z3CSFULH/32hDCysBOwDzgxSKdR1LTJPoeDCH8\nisy+368De8cYv0w2rqQ6JPF+XgD8uZaxrcj84/pZMj+8uz2KVBhJ/d38X2ARsGEIoX2M8dsVxr9b\n8zil+ZEl5ZHUe7lDzWNtN61d0r/ie1xSy2MNrBauAFeLFGOcSOaO032BM1YYHkpmT7K7Y4xzAEII\n7UIIm4QQ1m/OeSQlK6n3cs3YxWSK32OBPS1+S8WVxPs5xjgvxvjjfF/Af2qm3VXTd1/BX5RUhhL8\nOftL4D4yH7O+ZPmxEMLeZG6CWQU8WoCXIZW9BH/OHlPzeEoIYa3lB0II+5MpmM0Hnk/2FUhqKmtg\njRdiLLt9z9VK1LyRnydzh/nhwHhgO2B3Mh/X2DHGOKNmbl8yd5+fGmPs29TzSEpeEu/lEMIJZG7K\nsxi4ifx7lk2JMd5ZoJchieT+bq7l3JVktkE5OcZ4ewHiS6qR4M/ZqwHPARuQKaK9DKxLZt/gCHw/\nxvivwr8iqTwl9HN2BZk9+/cCZgMPAp+S2a7sQDI3zRscY7yhKC9KKlMhhEOBQ2uavcn8InkSy35J\n9WWM8Rc1c/tiDaxR3AJFLVaMcWIIYWvgUmA/4ABgOnAjMLShN71L6jySmiah9+B6NY9tgMG1zHmG\nTJFcUoH4d6pUGhL8OfvzEMJ2wEVkit7bkymgPQxcFWMsu49YS8WUxHs5xlgdQjiAzGrRY8i8lzsB\nM4GRwI0xxscL9BIkLbMlcMIKff1qvgCmAr+o7yT+vJ6fK8AlSZIkSZIkSSXJPcAlSZIkSZIkSSXJ\nArgkSZIkSZIkqSRZAJckSZIkSZIklSQL4JIkSZIkSZKkkmQBXJIkSZIkSZJUkiyAS5IkSZIkSZJK\nkgVwSZIkSZIkSVJJsgAuSZIkSZIkSSpJFsAlSZIkSZIkSSXJArgkSZIkSZIkqSRZAJckSZIkSZIk\n5QghHBlCuCmEMCaE8HUIIYYQ/lqA63wvhHB3CGFaCGFBCOHzEMIzIYTjm3tuC+CSJElqNUIIo0MI\nMe0cSQohbBhCeDCE8GnNPyhmpZ2pNQoh3Fnz/eubdpbl5ftvNoQwsCZrZTPPPSWE/9/enUfbUVV5\nHP/+ZEZoptAooIwiEZAh0gtE7ESIDCKRUZAp0AgoMsuQBkwwLGSQudulOBBggSJhJtA0gkFkshlC\nGmyVKciggoxCmNn9xz6VFDd137sv970AL7/PWqziVZ176ty6VVl19921j6b1of2KZb8Tutnv7JA0\nrux7+Jzet5mZmXXlGOBbwDrAkwOxA0mjgXuBrwC3AKcCEwEBW3bb/7zddmBmZmZmHyy1YNyfgU9G\nxGsNbaYBKwDzRcRbc3B4cxVJ8wBXAKsCFwBPALN8HrX2fQ3+7xkRE2Z3fN0ogehHgfMiYvR7MYae\nlCDwHryHx8jMzMzsA+AQ8h71IeBfgV/3Z+eSNgB+AtwPbB4Rf23ZPl+3+3AA3MzMzGzu9XHgYODE\n93gcc7OVgE8BP46IfTpof1zDuoOBxYAzgRdatk3pYmw2cH4HDAX+3mU/m/TDWMzMzMzaiogZAW9J\nHb1G0s7APmTW+EJkUsSFwCkR8XpL85OBeYBdW4PfZf9vztbAaxwANzMzM5s7PQ8EMEbSTyKi20Cc\nzZ5ly/KpThpHxLjWdeWR0cWAMyJiWn8NzAZOREwH/tAP/TzcD8MxMzMz6zeSfgrsRWaNX0YmaGwA\njAc2kTSyesJU0vLAxsBdwAOSRgDDyO8pU4BfR8Q73Y7JNcDNzMzM5k7TyZvQfwLGdvKC3uoWN9Uj\nljS6vGa0pJFl8pyXJT0j6VxJi5d260q6RtLzZftVPdVylrSApOMlPVomyXlY0lhJ87dpv3qpEV1N\nqvM3SRdJ+mRD26qW9MqSDpA0VdKrkiZ3eJyGSbq0TNzzuqTHJP1A0kdb2gVwc/lzbNln13Wha/1P\nLv3NL+k7kv5YxjOh1mZ5Sf8h6ZGy7dly7Ndv6G/Z0s+tpV75G5KeKsdxaEvbcWSmD8AetfcWJWBf\nb7uZpGsl/b32WZ5SnRsN49i0nEevSHpO0hWSVu/uaL2r/+q4zSvp3yU9WMb1uKSTejjHdpJ0dzlX\nnpZ0gaRl27Sd5VqS9IdyTIe0ec1R5TX719Y11gCXtKik0yQ9Iem10vehtPn+px5q69ev4Zb1IySd\nI+n3ygmxXpV0f7kOF2zqq03/G0u6uoz19XJu3SGpo3+XzMzM7P2j3C/sBVwOrBYR/xYRh0XERuST\njMOB/Wsvqe45HwRuKv+dAnwf+BUwRdKq3Y7LGeBmZmZmc6//JCe02VfS2RHxpwHc19bAVsA1wA+B\nzwKjgZUkHQXcSE5481NgLeDLwCqS1mqT9fFL8oZ5IvAmMAoYB3xG0tYRMSOYJ2lzMvtkPuBqsn7h\n8sC2wJckjYiIexr2cSaZkTIJuBZ4u7c3KWkr4FJywp6JwGNkFss3gFGSNqplaR8HrEjWob4ZmFzW\nT6Z/XUoeq+vIeuNPl7GuB/w3sCRwPXmMhpCTD/1W0jYRcW2tn88DR5F1Hy8FXgY+AWwPbF3e2321\n97A4cBBwX9lvZUr1P5K+Qx6H58hz42ng08C3gS0lbRgRL9Xabw9cDLxRln8BPgfcDkydjWPTk4vI\nz/864CVyAqYjgH8G9qw3lHQIcBqZ4XR+WW4G3Aa82OH+zgNOAHYGzm7Yvjv5vn/RUyeSFiCvp/XJ\nY38h+VkcS9bt7C9HAquT73ESsCCwEXkdDpe0aUT0eM2Ua3MSeXyvIifWWpIsD/NNmkv+mJmZ2fvX\nQcBbwF4R8WrLtvHkd49dyPtsyPsqgB3J0nDbkvcxS5NJOrsBk8p3gjdmd1AOgJuZmZnNpSLizRJ8\nvoSsA77tAO5ua2CTiLgZQNKHyKDrpmRweZ+IuLBqrJmPTn4ZuLKhv6HAGhHxfGl/NBmY3QrYlZxQ\nEklLAD8nM94/HxG/r+1jDeBOctKd9Rr2sR6wbkQ82rBtFpIWASaQ99jDI+KW2rYjyWN8DvBFyHIm\nkoaTAfDJTeVN+skKwJr1MjeS5iV/RFgEGFF9LmXbssD/AD+VtGKtTuNNwDIR8Y9655LWBm4l398W\nABExuWQmHwRMaVO6ZQQZ4Lwd2DIiXqhtGw2cW7YfUtYtAvwIeAfYOCLuqrU/nayF3p9WIc+x58o+\njiYDyrtLGlPVqFQ+qXAiWVZoveoHDkljyGur0+vqfOB48nx4VwC8ZOQPBS6LiGd76ecwMvh9GbBD\n9QOSpBOBuzscSye+CTxa/7Gp7Gc8cAz5w8jFvfTxdTIrfXjtx5Oqn8ZMeDMzM3t/krQwsDYZyD5Y\nzfXCXyfvaSrz1JZ7R8Q15e+XJO1R2n4G2I68p58tLoFiZmZmNheLiIlkAHIbSZ8bwF39vB5kLUG5\nC8qf99eD38X5ZblOm/7GV8Hv0t9rwJjy5161druT2a9j68Hv8poHgB8D60r6VMM+Tu40+F2MApYC\nLq4Hv4tTgWnASEkf70Of/eHYhhrvXyIDvGfXPxeAiHiKnIzoI9QmWYyIp1uD32X9fWRwfISk+fow\nrgPL8uv14HfpcwKZKb5LbfUoMjv4onrwuxhH55nWnTqyCn6XMb1CZlN/iPwiVtkFmJ88ltNq7d8B\nDicD9r2KiCfJjKdh5ceZuj3K8rwOutqz7POI+tMT5Vw+q5OxdCIiHmkNfhdnlOVmfeiuNUMMz0tg\nZmb2gbME+RRklb3d9N+yZAJGpbqff51Mipmh3GdUiTD/0s3AnAFuZmZmZoeRZQxOlbRBm6BWt1oD\nljBz4semrNQny3L5Nv3d3LDuFvKRy3Vr6zYsy7XVXFt7tbIcCvy+Zdvv2uy7nSqL/KbWDRHxlqTf\nkCVP1gX+3Me+u9H0PqrjskKb4/KJshxK7cuIpC8B+5EB4CHM+n1iCFmWpBMbkuVrdpC0Q8P2+YGl\nJS1Vsp6r4zvLZx8RL0qaQv+W+Gg6Zx8vyyVq63oa1yOSHiez8DsxARhJBryPACg1x3cCnqHli2Er\nSYsCqwKPt5kgczId1vzvjaQPkxn+25DX0aLkl97Kch10cyGZIX+npIvJpzhujYgn+mOMZmZmNkdV\nyQj3RkTT05VN/liW/2hT9rAKkC/UzcAcADczMzOby0XE7ZImkiULdqT3sgWzoyk7960OtrXLKP5b\n64qIeFvSs8ysJQiZkQ1ZaqEnizSs+2svr2m1WFm2CwBX6xfvY7/danof1XFpCjzXzTgukg4k6zU+\nD9xABvGnA0HWDV8bWKAP41qK/D7SW0B2EeBZZh7fWT77oq+fV49as9KL6rycp7auk3F1GgC/nKyH\nvWsps/I2WdZnKeCMiHirx1fPoWNUMv1vIrOx7if/zXiG/EED8jPt9VyIiMtK3fzDyCc39i393w2M\niYgb+mO8ZmZmNvAi4mVJDwBrSFqy/iRdD6aSJVOGSFomIlrvYdYsy2ndjM0lUMzMzMwMcnLDN4Hv\nlYzTJlVWRrskisXarB8Iy7SukDQPGSh8qba6Cq6vHRHq4b+m0hJ9zYSv9vWRNts/2tJujmiT0V+N\nYVQvx+U4mFEz/DgygLpGRHw1Ig6PiLGlvne7gGtPXgSe72X/iojHWsY8y2dftDvuA63fxlUmi/ol\nea6MLKv7Uv5kdsdS1QlvurYXb1g3igx+nxcRa0XEPhFxdDkXftTBOGeIiEkR8QUyq34T4HRgDeCa\nNqWJzMzM7P3rNPIpvp9JWrx1o6QlykTsQD4lycx7h5PLPEFV27WA0WQCwsRuBuUAuJmZmZlRyiX8\nAFgJOKBNs+oRxI+1bpC0KnM2s7mp1MXGZHD+3tq6O2rbBlq13+GtG0pgsaqxfs8cGEtv+npchpCf\n720R8a4M9zI5ZdNjrm+X5TwN26oxLNFQ77qd6rjN8tlLWoz29eIHWk/jWpmG66UXE8pyjzIR5BbA\n1IiY0tsLS432h4DlJK3S0GR4m5e2vbZ5d73zyqpleWnDttkqQxMRr0TETRFxKHAC+eV5i9npy8zM\nzPqPpK9ImiBpApk0A7BhtU7S96u2EfEz8jvFKOBhSRdJOlHSOZJuIJMp9mnZxQnkfeHuwF2STpN0\nATlZ/YLkvCwPdfMeHAA3MzMzs8p3gReAo2kuCfIHMrt6lKQZZUYkLUQ/Tq7XoWMlzajDLGlB4Hvl\nz3Nr7c4l39NYSbNMniPpQ5KG99OYrgCeA3aWtEHLtoOBlYFfRcScrP/dzpXAw8D+krZsaiBpQ0kL\nlz+fJsudDCsB76rNfGRZlCENXTxPZtG3m/Tz9LL8saRlG/b/4ZbjeGXp82uSWoOy45izTyDUXUg+\nPXGApBWrlSWD6RT6+J0rIm4FHiS/OH6DLAM0oQ9dnFv2eVJLFtVKzJx4tFVVJ/5dpYIkbQLs3NB+\nWlkOb2m/MnBSpwOVtEn596NVlcE+vdO+zMzMbMCsQz6RtgczJ7leubZu+3rjiNgf+DJwO7ApcCiw\nNXmvdgozJ8yu2k8nnwI7DlgY2L+0vw3YMiJO6/YNuAa4mZmZmQEQEc9JOgE4uc32NyWdCRwL3Cvp\ncvJ+ciQ5oeVTTa8bIP8HPFBql79JBgtXASYBF9TG/Kyk7cnayndIuhF4gCz58HFyIsalyOySrpS6\nh3sBlwA3S7qErJM9DPgimfGyb7f76Q/ls9wWuB6YJOk2YAoZcPwYsD75xeajwPSIeEfSWWTWz/9K\nupLM0B0BLElOXjiiZR8vS7oT2FjShcCfyKzwqyJiakTcKOko8oeLByVdCzxK/viyAplJ/Ftg81p/\n+5D1pm8pkyb+hcysXxP4DfD5/j9aPYuIaeV9nEpeFxeTpUg2I7PmpwKf7mO35wPjyWvtLeCiPrz2\nVLIm+3bAPZKuJ79wfpU8Rls3vOZc4HBgjKS1yQlhVyMzsC8vfdVdTWaaH1oeT76XvJ62Iq/Bdj96\nNI11RUmTyaD6G+T18gXgMeAXHfZjZmZmA6SUOBvXx9dcA1zTh/bTyz76tJ9OOQPczMzMzOrOoudJ\nZsYCY4DXyMcXtyTLIGzGzAnw5oQdgZ+R2SXfIu9rxwHbtda8jogbyQDkD4AVgf2Avcmg6U3ATv01\nqIi4EtgIuJY8Jt8GhgI/BIZFxCP9ta9uRcRUcuLKk8gA6Z5kxvEwMqC5GzkpUeVYcrLCV8lA/rbA\nXWQt6HZZ7buRAdHNyXNnPLVyKRFxEhm0nkQet4PJiTmXA84BjmkZ88TS193kObAfmXW/IRk8f0+U\nzKSvlTGMJid0vB/4LDPLi/TF+eSPNPMB/9UwIVRPY3mdzLY6HVgaOIjM1D4eOKTNa54mf3C4jvw8\nvkGeEyNp+PIaEa+QQeqLyHrdB5LX2Hhg107HSj7yfF3pY2/y81ymrF8/Imbn2JmZmZm9i5rnxDEz\nMzMzMzMzMzMz+2BzBriZmZmZmZmZmZmZDUoOgJuZmZmZmZmZmZnZoOQAuJmZmZmZmZmZmZkNSg6A\nm5mZmZmZmZmZmdmg5AC4mZmZmZmZmZmZmQ1KDoCbmZmZmZmZmZmZ2aDkALiZmZmZmZmZmZmZDUoO\ngJuZnPJ2wQAAAJNJREFUmZmZmZmZmZnZoOQAuJmZmZmZmZmZmZkNSg6Am5mZmZmZmZmZmdmg5AC4\nmZmZmZmZmZmZmQ1KDoCbmZmZmZmZmZmZ2aDkALiZmZmZmZmZmZmZDUoOgJuZmZmZmZmZmZnZoOQA\nuJmZmZmZmZmZmZkNSg6Am5mZmZmZmZmZmdmg5AC4mZmZmZmZmZmZmQ1K/w8CgQx9JIgMwAAAAABJ\nRU5ErkJggg==\n",
            "text/plain": [
              "\u003cFigure size 1200x800 with 1 Axes\u003e"
            ]
          },
          "metadata": {
            "image/png": {
              "height": 494,
              "width": 736
            }
          },
          "output_type": "display_data"
        }
      ],
      "source": [
        "plt.figure(figsize=(12, 8))\n",
        "num_individuals = range(len(uplift_predictions))\n",
        "plt.plot(num_individuals, uplift_incremental_visits, label=\"uplift_targeting\")\n",
        "plt.plot(num_individuals, random_incremental_visits, label=\"random_targeting\")\n",
        "plt.title(\"Absolute Cumulative Uplift Curve\")\n",
        "plt.ylabel(\"Cumulative Incremental Visits\")\n",
        "plt.xlabel(\"Number of Treated Individuals\")\n",
        "plt.legend(loc=\"lower right\")\n",
        "plt.rc('font', size=14)\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "JYXC8LK8RKLQ"
      },
      "source": [
        "The uplift curve demonstrates that targeting customers with the uplift model can lead to significantly more visits than random selection. For example, uplift targeting could bring in 5000 extra visits when treating 100k individuals, while random selection would likely yield less than 2000 extra visits.\n",
        "\n",
        "As mentioned earlier, the uplift curve is just one evaluation method which can also be turned into a more rigurous, quantifiable metric by measuring the area under the uplift curve (AUUC). See this paper [[4](https://arxiv.org/pdf/2002.05897.pdf)] for a more comprehensive overview of the various metrics used in uplift modeling."
      ]
    }
  ],
  "metadata": {
    "colab": {
      "last_runtime": {
        "build_target": "//learning/grp/tools/ml_python:ml_notebook",
        "kind": "private"
      },
      "provenance": [
        {
          "file_id": "1QmPiH1YvWKUk-MkUsJvTlfk3gmhlcXlQ",
          "timestamp": 1711525016304
        }
      ],
      "toc_visible": true
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}
